package controllers

import (
	"net/http"
	"strings"

	"game-simple/internal/framework/auth/dto"
	"game-simple/internal/framework/auth/models"
	"game-simple/internal/framework/auth/services"

	"github.com/gin-gonic/gin"
)

type Controller struct {
	service *services.Service
}

func NewController() *Controller {
	return &Controller{
		service: services.NewService(),
	}
}

// Login 用户登录
// @Summary      用户登录
// @Description  用户登录接口，返回 JWT token
// @Tags         认证
// @Accept       json
// @Produce      json
// @Param        credentials body dto.LoginRequest true "登录信息"
// @Success      200 {object} dto.AuthResponse "登录成功"
// @Failure      400 {object} map[string]string "请求参数错误"
// @Failure      401 {object} map[string]string "用户名或密码错误"
// @Router       /auth/login [post]
func (c *Controller) Login(ctx *gin.Context) {
	var req dto.LoginRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	authResponse, err := c.service.Login(&req)
	if err != nil {
		ctx.JSON(http.StatusUnauthorized, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, authResponse)
}

// Logout 用户登出
// @Summary      用户登出
// @Description  用户登出接口，使 token 失效
// @Tags         认证
// @Accept       json
// @Produce      json
// @Security     BearerAuth
// @Success      200 {object} map[string]string "登出成功"
// @Failure      401 {object} map[string]string "未授权"
// @Router       /auth/logout [post]
func (c *Controller) Logout(ctx *gin.Context) {
	userModel, exists := ctx.Get("user")
	if !exists {
		ctx.JSON(http.StatusUnauthorized, gin.H{"error": "未授权"})
		return
	}

	// 从中间件设置的上下文中获取 token（如果需要）
	// 这里简化处理，直接从 header 获取用于登出
	authHeader := ctx.GetHeader("Authorization")
	token := ""
	if authHeader != "" {
		parts := strings.Split(authHeader, " ")
		if len(parts) == 2 && parts[0] == "Bearer" {
			token = parts[1]
		}
	}
	if token == "" {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "缺少 token"})
		return
	}

	var userID uint
	if u, ok := userModel.(*models.UserModel); ok {
		userID = u.ID
	} else {
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": "用户数据格式错误"})
		return
	}

	if err := c.service.Logout(token, userID); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, gin.H{"message": "登出成功"})
}

// RefreshToken 刷新 token
// @Summary      刷新 Token
// @Description  刷新过期的 JWT token，返回新的 token
// @Tags         认证
// @Accept       json
// @Produce      json
// @Param        refresh body dto.RefreshTokenRequest true "刷新 token 请求"
// @Success      200 {object} dto.AuthResponse "刷新成功"
// @Failure      400 {object} map[string]string "请求参数错误"
// @Failure      401 {object} map[string]string "无效的 token"
// @Router       /auth/refresh [post]
func (c *Controller) RefreshToken(ctx *gin.Context) {
	var req dto.RefreshTokenRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	authResponse, err := c.service.RefreshToken(req.Token)
	if err != nil {
		ctx.JSON(http.StatusUnauthorized, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, authResponse)
}

// GetCurrentUser 获取当前用户信息
// @Summary      获取当前用户信息
// @Description  获取当前登录用户的详细信息
// @Tags         认证
// @Accept       json
// @Produce      json
// @Security     BearerAuth
// @Success      200 {object} dto.UserResponse "用户信息"
// @Failure      401 {object} map[string]string "未授权"
// @Router       /auth/me [get]
func (c *Controller) GetCurrentUser(ctx *gin.Context) {
	userModel, exists := ctx.Get("user")
	if !exists {
		ctx.JSON(http.StatusUnauthorized, gin.H{"error": "未授权"})
		return
	}

	if u, ok := userModel.(*models.UserModel); ok {
		ctx.JSON(http.StatusOK, u.ToUserResponse())
		return
	}

	ctx.JSON(http.StatusInternalServerError, gin.H{"error": "用户数据格式错误"})
}
